/*
  DOS 執行指令物件。
  2009-03-06 : 增加去除空白行方法〝trimMessage〞，當要由程式解析執行結果，多餘的空白行是比較無意義的。

  2009-03-04 : 增加指令寫入的方法〝append〞，長串的指令必定要使用 StringBuilder，所以就由本物件提供相關方法較為方便。
  2009-03-04 : 增加列印執行結果方法〝printMessages〞，便於除錯。
  2009-03-04 : 增加列關閉例外列印方法〝closeException〞，便於在沒有合法指令的環境下測試〈例如 AD 環境〉。
*/

package idv.jieh.commons.io;

import java.io.*;
import java.util.*;

public class MyCommander extends idv.jieh.commons.comm.BasicClass {
  private boolean closeException = false;
  private boolean trimMessage = false;

  private boolean is_real_exec = false;

  private ArrayList <String>messages = new ArrayList();
  private StringBuilder cmd = new StringBuilder();
  private boolean keepRunningMessage = true;
  private boolean realtimeShowMessage = false;

  public StringBuilder append(String cmd_str){
    return cmd.append(cmd_str);
  }

  public boolean exec(){
    return exec(cmd.toString());
  }

  public void clear(){
    is_real_exec = false;
    cmd.setLength(0);
    messages.clear();
  }

  public boolean exec(String cmd){
    dbr.debug("exec", "輸入指令 : " + cmd);
    if(!(is_real_exec = cmd.length() > 0)) return true;

    try {
      keepRunningMessage(Runtime.getRuntime().exec(cmd));
    } catch (IOException ex) {
      if(!closeException) dbr.exception(ex);
      return false;
    }
    return true;
  }

  private void keepRunningMessage(Process p) throws IOException{
    if(!keepRunningMessage && !realtimeShowMessage) return;
    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()), 512);
//      try {
//        System.out.println("waitFor : " + p.waitFor());
//      } catch (InterruptedException ex) { ex.printStackTrace(); }

    String line;
    while((line = input.readLine()) != null){
      if(realtimeShowMessage)
        System.out.println(line);

      if(keepRunningMessage && (!trimMessage || (trimMessage && line.length() !=0)))
        messages.add(line);
    }
    // 要使用 input.ready() 一定要搭配 waitFor() 否則系統執行太快結束沒有訊息可以抓回。
//      while(input.ready()){ messages.add(input.readLine()); }
    input.close();
  }

  public ArrayList getMessages(){
    if(is_real_exec)
      dbr.debug("getMessages", "指令執行結果 : ".concat(messages.toString()));
    return messages;
  }

  public void printMessages(){
    System.out.println("****** 指令執行結果列印開始 ******");
    if(is_real_exec){
      for (String msg : messages) {
        System.out.println(msg);
      }
    }else{
      System.out.println("您並未輸入任何有效指令，不要給我莊孝維！");
    }
    System.out.println("****** 指令執行結果列印結束 ******");
  }

  public String toString(){
    return cmd.toString();
  }

  public static void main(String[] args) {
    MyCommander me = new MyCommander();
    me.setTrimMessage(true);
    me.keepRunningMessage(false);
    me.realtimeShowMessage(true);
    me.exec(args.length == 1?args[0]:"ping ext190");
    me.printMessages();
  }

  public void realtimeShowMessage(boolean realtime){
    realtimeShowMessage = realtime;
  }

  public void setCloseException(boolean closeException) {
    this.closeException = closeException;
  }

  public void setTrimMessage(boolean trimMessage) {
    this.trimMessage = trimMessage;
  }

  public void keepRunningMessage(boolean keep) {
    this.keepRunningMessage = keep;
  }
}


/*
 keycode   0 =
 keycode   1 =
 keycode   2 =
 keycode   3 =
 keycode   4 =
 keycode   5 =
 keycode   6 =
 keycode   7 =
 keycode   8 = BackSpace
 keycode   9 = Tab
 keycode  10 =
 keycode  11 =
 keycode  12 = Clear
 keycode  13 = Enter
 keycode  14 =
 keycode  15 =
 keycode  16 = Shift_L
 keycode  17 = Control_L
 keycode  18 = Alt_L
 keycode  19 = Pause
 keycode  20 = Caps_Lock
 keycode  21 =
 keycode  22 =
 keycode  23 =
 keycode  24 =
 keycode  25 =
 keycode  26 =
 keycode  27 = Esc Escape
 keycode  28 =
 keycode  29 =
 keycode  30 =
 keycode  31 =
 keycode  32 = Space
 keycode  33 = Page Up
 keycode  34 = Page Down
 keycode  35 = End
 keycode  36 = Home
 keycode  37 = Left Arrow
 keycode  38 = Up Arrow
 keycode  39 = Right Arrow
 keycode  40 = Down Arrow
 keycode  41 = Select
 keycode  42 = Print
 keycode  43 = Execute
 keycode  44 =
 keycode  45 = Insert
 keycode  46 = Delete
 keycode  47 = Help
 keycode  48 = 0 )
 keycode  49 = 1 !
 keycode  50 = 2 @
 keycode  51 = 3 #
 keycode  52 = 4 $
 keycode  53 = 5 %
 keycode  54 = 6 ^
 keycode  55 = 7 &
 keycode  56 = 8 *
 keycode  57 = 9 (
 keycode  58 =
 keycode  59 =
 keycode  60 =
 keycode  61 =
 keycode  62 =
 keycode  63 =
 keycode  64 =
 keycode  65 = a A
 keycode  66 = b B
 keycode  67 = c C
 keycode  68 = d D
 keycode  69 = e E
 keycode  70 = f F
 keycode  71 = g G
 keycode  72 = h H
 keycode  73 = i I
 keycode  74 = j J
 keycode  75 = k K
 keycode  76 = l L
 keycode  77 = m M
 keycode  78 = n N
 keycode  79 = o O
 keycode  80 = p P
 keycode  81 = q Q
 keycode  82 = r R
 keycode  83 = s S
 keycode  84 = t T
 keycode  85 = u U
 keycode  86 = v V
 keycode  87 = w W
 keycode  88 = x X
 keycode  89 = y Y
 keycode  90 = z Z
 keycode  91 =
 keycode  92 =
 keycode  93 =
 keycode  94 =
 keycode  95 =
 keycode  96 = KP_0
 keycode  97 = KP_1
 keycode  98 = KP_2
 keycode  99 = KP_3
 keycode 100 = KP_4
 keycode 101 = KP_5
 keycode 102 = KP_6
 keycode 103 = KP_7
 keycode 104 = KP_8
 keycode 105 = KP_9
 keycode 106 = KP_* KP_Multiply
 keycode 107 = KP_+ KP_Add
 keycode 108 = KP_Enter KP_Separator
 keycode 109 = KP_- KP_Subtract
 keycode 110 = KP_. KP_Decimal
 keycode 111 = KP_/ KP_Divide
 keycode 112 = F1
 keycode 113 = F2
 keycode 114 = F3
 keycode 115 = F4
 keycode 116 = F5
 keycode 117 = F6
 keycode 118 = F7
 keycode 119 = F8
 keycode 120 = F9
 keycode 121 = F10
 keycode 122 = F11
 keycode 123 = F12
 keycode 124 = F13
 keycode 125 = F14
 keycode 126 = F15
 keycode 127 = F16
 keycode 128 = F17
 keycode 129 = F18
 keycode 130 = F19
 keycode 131 = F20
 keycode 132 = F21
 keycode 133 = F22
 keycode 134 = F23
 keycode 135 = F24
 keycode 136 = Num_Lock
 keycode 137 = Scroll_Lock
 keycode 138 =
 keycode 139 =
 keycode 140 =
 keycode 141 =
 keycode 142 =
 keycode 143 =
 keycode 144 =
 keycode 145 =
 keycode 146 =
 keycode 147 =
 keycode 148 =
 keycode 149 =
 keycode 150 =
 keycode 151 =
 keycode 152 =
 keycode 153 =
 keycode 154 =
 keycode 155 =
 keycode 156 =
 keycode 157 =
 keycode 158 =
 keycode 159 =
 keycode 160 =
 keycode 161 =
 keycode 162 =
 keycode 163 =
 keycode 164 =
 keycode 165 =
 keycode 166 =
 keycode 167 =
 keycode 168 =
 keycode 169 =
 keycode 170 =
 keycode 171 =
 keycode 172 =
 keycode 173 =
 keycode 174 =
 keycode 175 =
 keycode 176 =
 keycode 177 =
 keycode 178 =
 keycode 179 =
 keycode 180 =
 keycode 181 =
 keycode 182 =
 keycode 183 =
 keycode 184 =
 keycode 185 =
 keycode 186 =
 keycode 187 = =+
 keycode 188 = ,<
 keycode 189 = -_
 keycode 190 = .>
 keycode 191 = /?
 keycode 192 = `~
 keycode 193 =
 keycode 194 =
 keycode 195 =
 keycode 196 =
 keycode 197 =
 keycode 198 =
 keycode 199 =
 keycode 200 =
 keycode 201 =
 keycode 202 =
 keycode 203 =
 keycode 204 =
 keycode 205 =
 keycode 206 =
 keycode 207 =
 keycode 208 =
 keycode 209 =
 keycode 210 = plusminus hyphen macron
 keycode 211 =
 keycode 212 = copyright registered
 keycode 213 = guillemotleft guillemotright
 keycode 214 = masculine ordfeminine
 keycode 215 = ae AE
 keycode 216 = cent yen
 keycode 217 = questiondown exclamdown
 keycode 218 = onequarter onehalf threequarters
 keycode 219 = [{
 keycode 220 = \|
 keycode 221 = ]}
 keycode 222 = '"
 keycode 223 =
 keycode 224 =
 keycode 225 =
 keycode 226 =
 keycode 227 = multiply division
 keycode 228 = acircumflex Acircumflex
 keycode 229 = ecircumflex Ecircumflex
 keycode 230 = icircumflex Icircumflex
 keycode 231 = ocircumflex Ocircumflex
 keycode 232 = ucircumflex Ucircumflex
 keycode 233 = ntilde Ntilde
 keycode 234 = yacute Yacute
 keycode 235 = oslash Ooblique
 keycode 236 = aring Aring
 keycode 237 = ccedilla Ccedilla
 keycode 238 = thorn THORN
 keycode 239 = eth ETH
 keycode 240 = diaeresis cedilla currency
 keycode 241 = agrave Agrave atilde Atilde
 keycode 242 = egrave Egrave
 keycode 243 = igrave Igrave
 keycode 244 = ograve Ograve otilde Otilde
 keycode 245 = ugrave Ugrave
 keycode 246 = adiaeresis Adiaeresis
 keycode 247 = ediaeresis Ediaeresis
 keycode 248 = idiaeresis Idiaeresis
 keycode 249 = odiaeresis Odiaeresis
 keycode 250 = udiaeresis Udiaeresis
 keycode 251 = ssharp question backslash
 keycode 252 = asciicircum degree
 keycode 253 = 3 sterling
 keycode 254 = Mode_switch
*/
